import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from tensorflow import _keras

plt.rcParams['figure.dpi'] = 180
plt.rcParams['axes.grid'] = False

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

train_images = train_images / 255.0      #像素的值除以255。
test_images = test_images / 255.0

model = tf.keras.Sequential([    #选择序贯模型
    tf.keras.layers.Flatten(input_shape=(28, 28)), #Flatten层用来将输入“压平”，即把多维的输入一维化，常用在从卷积层到全连接层的过渡。
                                               #28*28变为1*784 Flatten不影响batch的大小。
    tf.keras.layers.Dense(128, activation='relu'),#添加全连接层，输出空间维度（节点）为128，激活函数为relu，作用是分类
    tf.keras.layers.Dense(10, activation='softmax')#添加全连接层，输出空间维度为10，激活函数为softmax
])

model.compile(optimizer='adam',        #Adam优化器，adam有默认的学习率，所以不用写lr大小，作用：自适应动态调整学习率
              loss='sparse_categorical_crossentropy',#损失函数
              metrics=['accuracy']) #评价函数为正确率
model.fit(train_images, train_labels, epochs=5)#训练5个回合
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2) #model.evaluate函数预测给定输入的输出，
                                                                           #verbose=2 为每个epoch输出一行记录

print("test_loss:", test_loss,  "    测试准确率为:", test_acc)

predictions = model.predict(test_images)
predictions[0]
np.argmax(predictions[0])#返回一个numpy数组中最大值的索引值。当一组中同时出现几个最大值时，返回第一个最大值的索引值


# plt.figure()
# plt.imshow(train_images[0])
# plt.colorbar()
# plt.grid(False)